<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    public function up(): void
    {
        // 检查并删除可能存在的 token 索引
        $indexes = DB::select("SHOW INDEX FROM `online_users` WHERE Column_name = 'token'");
        foreach ($indexes as $index) {
            $indexName = $index->Key_name;
            if ($indexName !== 'PRIMARY') {
                DB::statement("ALTER TABLE `online_users` DROP INDEX `{$indexName}`");
            }
        }

        // 使用原生 SQL 修改字段类型为 TEXT
        DB::statement('ALTER TABLE `online_users` MODIFY `token` TEXT NOT NULL');
        
        // 添加前缀索引（只索引前 100 个字符）
        // 这对于 JWT token 来说已经足够用于基本查询
        try {
            DB::statement('ALTER TABLE `online_users` ADD INDEX `online_users_token_prefix` (`token`(100))');
        } catch (\Exception $e) {
            // 如果索引已存在，忽略错误
            if (strpos($e->getMessage(), 'Duplicate key name') === false) {
                throw $e;
            }
        }
    }

    public function down(): void
    {
        // 删除前缀索引
        try {
            DB::statement('ALTER TABLE `online_users` DROP INDEX `online_users_token_prefix`');
        } catch (\Exception $e) {
            // 如果索引不存在，忽略错误
        }

        // 恢复为原来的 string 类型
        DB::statement('ALTER TABLE `online_users` MODIFY `token` VARCHAR(255) NOT NULL');
        
        // 重新添加唯一约束
        Schema::table('online_users', function (Blueprint $table) {
            $table->unique('token');
        });
    }
};
